package com.sgj.gulimall.cart.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: Guoji Shen
 * @Date: 2021/9/2 10:26
 */
// @EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) {
        /**
         * 七大参数
         * corePoolSize：核心线程数(只要线程池不销毁，就一直存在，除非allowCoreThreadTimeOut)，线程池创建好就准备就绪的线程数量，等待异步任务去执行
         * maximumPoolSize：最大线程数量，控制资源
         * keepAliveTime：存活时间，当前如果正在运行的线程数量，大于core数量时，会释放空闲线程(maximumPoolSize - corePoolSize)，只要线程空闲大于指定的存活时间
         * unit：时间单位
         * workQueue：阻塞队列，如果任务有很多，就会将目前多余的任务放在阻塞队列内。只要线程空闲，就会从阻塞队列中拿出任务执行。
         * threadFactory：线程的创建工厂。
         * handler：如果队列满了，按照指定的拒绝策略，拒绝执行任务。
         */
        return new ThreadPoolExecutor(pool.getCoreSize(),
                pool.getMaxSize(),
                pool.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),
                // AbortPolicy：直接丢弃任务
                new ThreadPoolExecutor.AbortPolicy()
        );
    }
}